package com.strato.annotation.base.v1_0_0.registry;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class MethodDescriptor extends AbstractAnnotationDescriptor{

	private String methodName;
	
	private List<MethodArgumentDescriptor> argumentDescriptors=new ArrayList<MethodArgumentDescriptor>();
	
	private ClassDescriptor classDescriptor;

	public ClassDescriptor getClassDescriptor() {
		return classDescriptor;
	}

	public void setClassDescriptor(ClassDescriptor classDescriptor) {
		this.classDescriptor = classDescriptor;
	}
	
	public List<MethodArgumentDescriptor> getArgumentDescriptors() {
		return argumentDescriptors;
	}

	public void setArgumentDescriptors(List<MethodArgumentDescriptor> argumentDescriptors) {
		this.argumentDescriptors = argumentDescriptors;
	}

	public String getMethodName() {
		return methodName;
	}

	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}

	public void discover(Method method) {
		setMethodName(method.getName());
		setAnnotations(extractAnnotations(method.getAnnotations()));
		Class<?>[] argumentTypes = method.getParameterTypes();
		int i=0;
		for(Class<?> type:argumentTypes){
			MethodArgumentDescriptor argDescriptor=new MethodArgumentDescriptor();
			argDescriptor.setTypeName(type.getName());
			argDescriptor.setMethodDescriptor(this);
			argDescriptor.setAnnotations(extractAnnotations(method.getParameterAnnotations()[i]));
			getArgumentDescriptors().add(argDescriptor);
			i++;
		}
	}

}
